package com.xygz.orm;

import com.xiyuan.smartutils.logging.Logger;
import com.xygz.orm.config.ORMConfig;
import com.xygz.orm.constants.ORMConstants;
import com.xygz.orm.exception.ORMException;

import java.sql.SQLException;

/**
 * the description for class ORMInstance
 *
 * @author xiyuan-lgz 2023-11-03 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public abstract class ORMServer implements ORMConstants {
    
    /**
     * 获取数据源ID
     *
     * @return 数据源ID
     */
    public abstract String getId();
    
    
    /**
     * 获取默认数据源 SQL（jdbc） 执行器， 如果没有指定默认数据库则去第一个数据库
     *
     * @return SQL（jdbc） 执行器
     */
    public abstract SQL getSQL();
    
    /**
     * 获取数据库定义对象
     *
     * @return 数据库定义对象
     */
    public abstract DDL getDDL();
    
    /**
     * 获取数据库操作对象
     *
     * @return 数据库操作对象
     */
    public abstract DB db();
    
    
    // /**
    //  * 获取数据库类型
    //  *
    //  * @return 数据库类型
    //  */
    // public abstract DbType getDbType();
    
    // /**
    //  * 转分页SQL
    //  *
    //  * @param src      原始 sql
    //  * @param pageNo   分页数
    //  * @param pageSize 分页大小
    //  * @return 分页后的sql
    //  */
    // public SQLWrapper toPageSQL(SQLWrapper src, int pageNo, int pageSize) throws ORMException;
    
    // /**
    //  * 判断是否是表不存在的异常
    //  *
    //  * @param e SQLException
    //  * @return =true表示表不存在
    //  */
    // public abstract boolean isTableNotExist(SQLException e);
    
    /**
     * 获取配置信息
     *
     * @return 数据库配置信息
     */
    public abstract ORMConfig getConfig();
    
    /**
     * @return SQL 查询记录器
     */
    public abstract Logger getQueryLogger();
    
    /**
     * @return 新增或者修改 日志记录器
     */
    public abstract Logger getUpdateLogger();
    
    public abstract void setConnectionHolder(ORMConnectionHolder holder);
    
    public abstract ORMConnectionHolder getConnectionHolder();
    /**
     * 获取数据源
     *
     * @return 数据源
     */
    public abstract ORMSource source() throws SQLException;
    
    protected abstract boolean open() throws ORMException;
    
    protected abstract void close() throws SQLException, ORMException;
    
}
